我正在从php中的普通mysql切换到PDO,我注意到测试错误的常用方法是使用try/catch组合而不是if/else组合.
该方法的优点是什么,我可以使用一个try/catch块而不是几个嵌套的if/else块来处理不同步骤(连接,准备,执行等)的所有错误吗?
我通过代码的正常路径应该没有错误地继续使用try/catch块,除非确实存在一些异常情况 - 例如服务器关闭,您的凭据已过期或不正确.我不一定会用它来处理非异常错误 - 比如当前用户没有正确的角色.也就是说,当你可以合理地期望并处理一个非特殊情况的错误时,我认为你应该做你的检查.
在您描述的情况下 - 设置和执行查询,try/catch块是处理它的绝佳方式,因为您通常希望查询成功.另一方面,您可能希望检查结果的内容是否是您对控制流逻辑的期望,而不是仅仅尝试使用可能对您无关的数据.
你想要注意的一件事是使用try/catch.Try/catch不应该被用来保护自己免受糟糕的编程 - "我不知道如果我这样做将会发生什么,所以我将把它包装在try/catch中并希望获得最好的"编程.通常,您需要将捕获的异常类型限制为与代码本身无关的异常(服务器关闭,错误凭据等),以便您可以找到并修复与代码相关的错误(空指针等) ).
通常,try-catch块很棒,因为每当异常发生时它们都会中断(移动到catch语句).If-else块依赖于您预测错误何时发生.
编辑:此外,catch块不会阻止您的代码在发生错误时停止.
try/catch和一般例外的优点更多的是开发像PDO这样的库的人.它们允许系统开发人员以快速简便的方式处理未定义的情况或意外结果.进行数据库连接.什么应该系统做,如果数据库无法达到.它应该停止执行吗?再试一次?发出警告并继续?系统开发人员无法知道您需要它做什么,他们会抛出异常,您将在以后捕获并处理.
作为系统的消费者,您的优势在于,而不是获得一些模糊的错误代码,或者一个简单的布尔值假失败,您将得到一个Exception对象,
以这样的方式命名,以便更明显出错(如果我没记错的话,PDO只有一个Exception类型,但是其他系统包含多种异常类型用于不同类型的错误)
可能/应包含的方法和属性,它可以帮助你找出为什么抛出异常
无论如何,这就是理论.有很多聪明的人声称例外是可行的方法.还有很多聪明的人认为Exceptions是魔鬼,也是懒惰系统开发人员的拐杖.在这个问题上没有任何类似的共识.
Try/Catch完全将错误处理逻辑与对象业务逻辑分开.
@Perchik:
我的错误处理的一般哲学:
您应该使用if/else来处理您期望的所有情况.你应该不使用try {}赶上{}来处理一切(在大多数情况下),因为一个有用的异常可能会被提出,并且您可以了解从一个bug的存在.你应该使用try {} catch {}在你怀疑某些事情可能/会出错的情况下你不希望它打倒整个系统,比如网络超时/文件系统访问问题,文件不存在等等.
烦恼的例外
与大多数其他原始操作相比,抛出和捕获异常是一项昂贵的操作.如果这是一段需要运行良好的代码(例如,在紧密的循环中),你将需要查看你的用例 - 如果你期望相对经常抛出异常,那么你最好使用if/else perforance-wise(除非底层代码只是为你包装一个例外,在这种情况下根本没有任何收益).如果仅在极少数情况下抛出异常,那么最好使用try/catch来避免在紧密循环中分支的开销.
这正是优势,使用一个try/catch而不是多个if语句.您还可以捕获任何意外错误.